package pl.edu.agh.student.nn.core;

import pl.edu.agh.student.nn.utils.InputParserUtils;

/**
 * 
 * Reprezentuje funkcje aktywacji neuronu. Aktualnie do wyboru sa funkcje liniowa, progowa i sigmoidalna.
 *
 */
public abstract class ActivationFunction {
    protected ActivationFunctionType type;

    ActivationFunction(ActivationFunctionType type) {
        this.type = type;
    }

    /**
     * Oblicza wynik dla podanego poziomu
     * @param input
     * @return 
     */
    public abstract double getResult(double input);
    
    public abstract double d(double input);

    /**
     * Zwraca opis funkcji aktywacji
     * @return
     */
    public abstract String display();

    /**
     * Zwraca typ funkcji aktywacji
     * @return
     */
    public ActivationFunctionType getType() {
        return type;
    }

    /**
     * Tworzenie funkcji aktywacji na podstawie zserializowanej postaci
     * @param serializedFunction zserializowana postac funkcji aktywacji
     * @return nowo stworzona funkcja aktywacji
     * @throws Exception
     */
    public static ActivationFunction getFunction(String serializedFunction) throws Exception {
        String[] functionDetails = serializedFunction.split("\\|");
        switch (ActivationFunctionType.valueOf(functionDetails[0])) {
            case L:
                return new LinearFunction(InputParserUtils.getDouble(functionDetails[1]),
                        InputParserUtils.getDouble(functionDetails[2]));
            case S:
                return new SigmoidalFunction(InputParserUtils.getDouble(functionDetails[1]));
            case T:
                return new ThresholdFunction(InputParserUtils.getDouble(functionDetails[1]));
            default:
                throw new Exception("Podana funkcja nie jest wspierana! - " + serializedFunction);
        }
    }

}
